iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
DevOps

今天不學遺傳學,跟著Kubernetes種豌豆系列 第 4

Day4. 容器與他們的產地 Fantastic containers and where to find them- 下

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20240808/20168178O7vpzb8Qie.png

從上篇中,認識到最小的部署單位為Pod,Pod的數量則是由ReplicaSet管理,而平時說到的Application,則是指最外層的Deployment,管理服務持續運作

Deployments 提供資訊予Pod及ReplicaSet

  • 根據設定建立ReplicaSet,生成名稱為[DEPLOYMENT-NAME]-[HASH]
  • 根據設定標定要管理的Pod,名稱為[DEPLOYMENT-NAME]-[REPLICASET_HASH]-[HASH]
  • 使用情境: 新增, 更新(rollout), 還原(rollback), 擴充, 暫停/繼續(resume)
    • 更新版本: 建立新的ReplicaSet, 移除舊ReplicaSet的Pod, 補上新ReplicaSet的Pod
      • 舊的ReplicaSet還在,所以能還原至前面版本
      • 更新策略有 2 種
        • Recreate: 先移除全部現存的Pods,接著再建立新Pods,交接期暫時無法使用服務
        • Rollingupdate(預設): 根據特定閾值逐步移除及建立Pods
apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-deployment
 labels:
   app: nginx
spec:
 replicas: 3 # 預設為1, 指定數量, 會新建ReplicaSet管理
 selector: # 必填: 使用標籤標記要管理哪些Pods, 對應container的label(immutable), 要自己注意別跟其它deployment的設定打架(無默契,會造成混亂)
   matchLabels:
     app: nginx 
 template: # 必填: 此Deploy Pod模板(目標狀態)
   metadata:
     labels:
       app: nginx
   spec:
     containers:
     - name: nginx
       image: nginx:1.14.2
       ports:
       - containerPort: 80
 strategy: # optional: 更新策略
   type: RollingUpdate # 預設逐步更新, 也可以是Recreate(先砍後建)
   rollingUpdate:
     maxSurge: 1 # 預設25% 或是 確切數值也可, 最多可超過多少目標數量(無條件進位)
     maxUnavailable: 1 # 預設25% 或是 確切數值也可, 最大不可用數量(無條件捨去)

https://ithelp.ithome.com.tw/upload/images/20240808/20168178851i8312pg.png

過渡期間,也就是處於關閉中的Pod不算是可用Pod,所以總和Pod數會 > 表面設定(replicas+ maxSurge),此情況延續到Pod優雅的退場完畢為止(terminationGracePeriodSeconeds)

Deployment的操作指令

# 建立Deployment(imperative),下指令必須放在最後面, 任何`--`後面的內容都被視為指令
kubectl create deployment <NAME> --image=<image> --replicas=x --port=xxx -- <command>
# 用create建立的話,需用replace更新
kubectl replace -f <檔案名稱>
kubectl replace --force -f <檔案名稱>
# 建立Deployment(declarative),更新時重apply即可
kubectl apply -f <檔案名稱>
# 取得Deployment資訊
kubectl get deployment <optional: 名稱> # 或簡稱deploy
# 查看由Deployment加給Pod的label`pod-template-hash`
kubectl get pods --show-labels 
# 查看生成的ReplicaSet
kubectl get replicaset #或簡稱rs, -w 可以持續監控數量變化
# 取得Deployment詳細資訊
kubectl describe deployments <optional:deployment名稱>
# 取得Deployment換版情況
kubectl rollout status deployment/<deployment名稱>
# 更新Deployment
# 設定image
kubectl set image deployment/<deployment名稱> <container名稱>=<image名稱>
# 設定resource
kubectl set resource deployment/<deployment名稱> -c=<container名稱> --limits=cpu=200m, memory=512Mi
# 設定replicas
kubectl scale deployment/<deployment名稱> replicas=x
# 設定autoScale(建議)
kubectl autoscale deployment/<deployment名稱>  --min=10 --max=5 --cpu-percent=80
# 直接修改既存的deployment(原始文件不同步異動)
kubectl edit deployment/<deployment名稱>
# 還原
kubectl rollout undo deployment/<deployment名稱> # 上一版
kubectl rollout undo deployment/<deployment名稱> --to-revision=2 # 特定版本
# 暫停/繼續版本更新
kubectl rollout pause deployment/<deployment名稱>
kubectl rollout resume deployment/<deployment名稱>
# 查看版本紀錄
kubectl rollout history deployment/<deployment名稱>
kubectl rollout history deployment/<deployment名稱> --revision=2

命名空間 Namespace之我是誰 我在哪 我要去哪裡?

🎰 在前些文章提到了命名空間「namespace」,這是K8s提供的機制,將叢集分割為不同群組,依照需求將資源隔離於限定範圍,常見使用情況有,區分不同階段的環境開發和正式環境,或是說不同的專案團隊,並能進一步設定資源使用量,以日常生活比喻的話,像是線上遊戲有不同的伺服器

  • 沒有巢狀結構: 伺服器內不會有其它伺服器
  • 資源隔離: 同伺服器內的名稱不可重複,但與其它伺服器的角色名稱相同可行

https://ithelp.ithome.com.tw/upload/images/20240808/20168178AxlVbVzAjG.png

大多數的Object隸屬於特定namespace,部分底層的Object則否,想看詳細的內容,可下指令

# In a namespace
kubectl api-resources --namespaced=true
# Not in a namespace
kubectl api-resources --namespaced=false

K8s有幾個初始的namespace

  • default: 預設可先使用的namespace
  • kube-node-lease: 放置Lease Object,這些Lease與各node相繫,用來傳送heatbeat(刷存在感)給控制平台,用以偵測節點是否正常運行
  • kube-public: 所有用戶端(包含未驗證)皆可讀取,用來放置跨cluster可公開的資源
  • kube-system: 放置由K8s系統建置的Object,像是etcd, api-server等

https://ithelp.ithome.com.tw/upload/images/20240808/201681780obnAet53k.png

Namespace的操作指令

# 取得namespace
kubectl get namespace
# 建立namespace
kubectl create namespace <名稱XXX>
# 查詢特定namespace的pod資訊
kubectl get pods --namespace=<名稱XXX>
# 切換namespace
kubectl config set-context --current --namespace=<名稱XXX>
kubectl config view --minify | grep namespace:

REF.


上一篇
Day3- 容器與他們的產地 fantastic containers and where to find them- 上
下一篇
Day5. 奇形種出沒! pod 與 container 還可以長這樣!?
系列文
今天不學遺傳學,跟著Kubernetes種豌豆7
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言